home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Suzy B Software 2
/
Suzy B Software CD-ROM 2 (1994).iso
/
extras
/
programm
/
basa2gfa
/
basica_2.gfa
(
.txt
)
next >
Wrap
GFA-BASIC Atari
|
1995-04-27
|
11KB
|
646 lines
' #############################################
' IBM PC BASICA to Atari ST GFA BASIC .LST
' conversion utility
' #############################################
' by myeck waters, 94/08/24
' This program is in the Public Domain
' #############################################
' Not to mention that it's pretty badly written
' #############################################
'
' #############
end$="ENDIF"+CHR$(13)+CHR$(10)
go$="GOTO"
pro$="PROCEDURE "
begin:
FILESELECT "*.bas","gwbasic.bas",a$
IF a$<>""
GOTO next1
ENDIF
END
' ##################################
' make sure input filename has a "."
' ##################################
next1:
l#=LEN(a$)
m#=l#
loop1:
IF MID$(a$,m#-1,1)="\"
GOTO next2
ENDIF
DEC m#
GOTO loop1
next2:
n#=l#
loop2:
IF MID$(a$,n#,1)="."
GOTO next3
ENDIF
IF n#=0
n#=l#+1
a$=a$+"."
GOTO next3
ENDIF
DEC n#
GOTO loop2
next3:
FILESELECT "*.*","output.lst",z$
IF z$<>""
GOTO next4
ENDIF
END
next4:
OPEN "I",#1,a$
' #################
' set buffers, etc.
' #################
size#=LOF(#1)
DIM inbuf%(5+INT(size#/4)) ! input buffer
DIM outbuf%(size#/2) ! output buffer
DIM numbers#(1000) ! for line numbers that are actually
DIM subs#(1000) ! used in GOSUB, GOTO, ELSE, THEN
inbuffer#=VARPTR(inbuf%(0))
outbuffer#=VARPTR(outbuf%(0))
atime#=TIMER/200 ! a timer
' ###################
' load BASICA file
' ###################
BLOAD a$,inbuffer#
PRINT
inptr#=inbuffer#
outptr#=outbuffer#
numcount#=0
' #############################
' checking for line numbers
' after GOTO, GOSUB, THEN, ELSE
' #############################
CLS
PRINT
PRINT "Checking for referenced line numbers:"
PRINT
kerser#=0
i#=0
search:
issub#=FALSE
b$=CHR$(PEEK(inbuffer#+i#))
IF b$="'" ! a REMark
GOTO foundrem
ENDIF
IF b$="R" OR b$="r" ! a REMark?
GOTO checkrem
ENDIF
IF b$="T" OR b$="t" ! THEN?
GOTO checkthen
ENDIF
IF b$="G" OR b$="g" ! GOTO or GOSUB?
GOTO checkgo
ENDIF
IF b$="E" OR b$="e" ! ELSE?
GOTO checkelse
ENDIF
INC i#
IF i#<size#
GOTO search
ENDIF
GOTO convert
' #############
' check for REM
' #############
checkrem:
INC i#
b$=CHR$(PEEK(inbuffer#+i#))
IF b$<>"E" AND b$<>"e"
GOTO search
ENDIF
INC i#
b$=CHR$(PEEK(inbuffer#+i#))
IF b$<>"M" AND b$<>"m"
GOTO search
ENDIF
' ############################################
' found a REM, nothing to check 'til next line
' ############################################
foundrem:
fr2:
INC i#
IF i#=>size#
GOTO convert
ENDIF
IF PEEK(inbuffer#+i#)<>13 ! CHR$(13) = <CR>
GOTO fr2
ENDIF
GOTO search
' ##############
' check for THEN
' ##############
checkthen:
INC i#
b$=CHR$(PEEK(inbuffer#+i#))
IF b$<>"H" AND b$<>"h"
GOTO search
ENDIF
INC i#
b$=CHR$(PEEK(inbuffer#+i#))
IF b$<>"E" AND b$<>"e"
GOTO search
ENDIF
INC i#
b$=CHR$(PEEK(inbuffer#+i#))
IF b$<>"N" AND b$<>"n"
GOTO search
ENDIF
GOTO checknum
' ##############
' check for ELSE
' ##############
checkelse:
INC i#
b$=CHR$(PEEK(inbuffer#+i#))
IF b$<>"L" AND b$<>"l"
GOTO search
ENDIF
INC i#
b$=CHR$(PEEK(inbuffer#+i#))
IF b$<>"S" AND b$<>"s"
GOTO search
ENDIF
INC i#
b$=CHR$(PEEK(inbuffer#+i#))
IF b$<>"E" AND b$<>"e"
GOTO search
ENDIF
GOTO checknum
' #######################
' check for GOSUB or GOTO
' #######################
checkgo:
INC i#
b$=CHR$(PEEK(inbuffer#+i#))
IF b$<>"O" AND b$<>"o"
GOTO search
ENDIF
INC i#
b$=CHR$(PEEK(inbuffer#+i#))
IF b$="S" OR b$="s"
GOTO checksub
ENDIF
IF b$<>"T" AND b$<>"t"
GOTO search
ENDIF
INC i#
b$=CHR$(PEEK(inbuffer#+i#))
IF b$<>"O" AND b$<>"o"
GOTO search
ENDIF
GOTO checknum
' ###############
' check for GOSUB
' ###############
checksub:
INC i#
b$=CHR$(PEEK(inbuffer#+i#))
IF b$<>"U" AND b$<>"u"
GOTO search
ENDIF
INC i#
b$=CHR$(PEEK(inbuffer#+i#))
IF b$<>"B" AND b$<>"b"
GOTO search
ENDIF
issub#=TRUE ! the GOSUB flag
' #####################
' look for line numbers
' #####################
checknum:
num$=""
cn1:
INC i#
IF i#=>size#
GOTO convert
ENDIF
b$=CHR$(PEEK(inbuffer#+i#))
IF b$=CHR$(13)
GOTO search
ENDIF
IF b$=" "
GOTO cn1
ENDIF
IF b$>"/" AND b$<":"
GOTO cn2
ENDIF
GOTO search
' ##################
' found line numbers
' ##################
cn2:
num$=""
cn3:
num$=num$+b$
INC i#
IF i#=>size#
GOSUB numend
GOTO search
ENDIF
b$=CHR$(PEEK(inbuffer#+i#))
IF b$>"/" AND b$<":"
GOTO cn3
ENDIF
IF b$="," ! commas always mean more line numbers(?)
GOSUB numend
INC i#
b$=CHR$(PEEK(inbuffer#+i#))
GOTO cn2
ENDIF
GOSUB numend
GOTO search
' ##############
PROCEDURE numend
IF VAL(num$)
IF numcount#=0
numbers#(numcount#)=VAL(num$)
PRINT num$;" ";
kerser#=kerser#+10
IF issub#
subs#(numcount#)=TRUE
ELSE
subs#(numcount#)=FALSE
ENDIF
INC numcount#
ELSE
match#=FALSE
FOR j#=0 TO numcount#
IF VAL(num$)=numbers#(j#)
match#=TRUE
ENDIF
NEXT j#
IF match#=FALSE
numbers#(numcount#)=VAL(num$)
HTAB kerser#+1
PRINT num$;
kerser#=kerser#+10
IF kerser#>70
kerser#=0
PRINT
ENDIF
IF issub#
subs#(numcount#)=TRUE
ELSE
subs#(numcount#)=FALSE
ENDIF
INC numcount#
ENDIF
ENDIF
ENDIF
RETURN
' ###############
' converting text
' ###############
convert:
PRINT
PRINT
PRINT "converting lines: "
PRINT
counter#=0
i#=0
o#=0
' ###############
' begin next line
' ###############
nextline:
PRINT ".";
IF counter#>999
temp#=FRE(0)
counter#=0
ENDIF
foundif#=FALSE
foundcom#=FALSE
inquotes#=FALSE
issub#=FALSE
line$=""
findline:
b#=PEEK(inbuffer#+i#)
IF b#<47 OR b#>58
INC i#
GOTO findline
ENDIF
' ###############
findline2:
b$=CHR$(PEEK(inbuffer#+i#))
IF b$>"/" AND b$<":"
line$=line$+b$
INC i#
GOTO findline2
ENDIF
line#=VAL(line$)
match#=FALSE
FOR j#=0 TO numcount#
IF line#=numbers#(j#)
match#=TRUE
IF subs#(j#)
issub#=TRUE
ENDIF
ENDIF
NEXT j#
IF match#
IF issub#
FOR j#=1 TO LEN(pro$)
POKE outbuffer#+o#,ASC(MID$(pro$,j#,1))
INC o#
NEXT j#
ENDIF
FOR j#=1 TO LEN(line$)
POKE outbuffer#+o#,ASC(MID$(line$,j#,1))
INC o#
NEXT j#
IF issub#=FALSE
POKE outbuffer#+o#,58
INC o#
ENDIF
POKE outbuffer#+o#,13
INC o#
POKE outbuffer#+o#,10
INC o#
ENDIF
' GOTO nextchar
' ###############################
' check for leading REM or ' or !
' ###############################
leadrem:
b$=CHR$(PEEK(inbuffer#+i#))
IF b$="'"
GOTO moverem
ENDIF
IF b$=" "
INC i#
GOTO leadrem
ENDIF
IF b$<>"R" AND b$<>"r"
GOTO nextchar
ENDIF
b$=CHR$(PEEK(inbuffer#+i#+1))
IF b$<>"E" AND b$<>"e"
GOTO nextchar
ENDIF
b$=CHR$(PEEK(inbuffer#+i#+2))
IF b$<>"M" AND b$<>"m"
GOTO nextchar
ENDIF
' ######################
' it's a REM, so move it
' ######################
moverem:
b#=PEEK(inbuffer#+i#)
POKE outbuffer#+o#,b#
INC i#
INC o#
IF b#=13
DEC o#
IF foundif#
byte#=b#
DEC i#
GOTO iscr
ENDIF
GOSUB crpoke
GOTO nextline
ENDIF
GOTO moverem
' ####################
' check next character
' ####################
nextchar:
IF i#=>size#
GOTO finis
ENDIF
byte#=PEEK(inbuffer#+i#)
' #######################
' is it a quote mark (")?
' #######################
IF byte#=34
IF inquotes#
inquotes#=FALSE
ELSE
inquotes#=TRUE
ENDIF
POKE outbuffer#+o#,byte#
INC o#
INC i#
GOTO nextchar
ENDIF
' ####################################
' an apostrophe'd REM after a command?
' ####################################
IF byte#=39 AND inquotes#=FALSE
POKE outbuffer#+o#,33
INC o#
INC i#
GOTO moverem
ENDIF
IF byte#=58 AND inquotes#=FALSE
' POKE outbuffer+o,13
' INC o
' POKE outbuffer+o,10
' INC o
' INC i
GOSUB crpoke
foundcom#=FALSE
' foundif=FALSE
GOTO nextchar
ENDIF
' ##########################
' an actual carriage retuen?
' ##########################
iscr:
IF byte#=13
GOSUB crpoke
INC i#
IF foundif#
WHILE foundif#
FOR j#=1 TO LEN(end$)
POKE outbuffer#+o#,ASC(MID$(end$,j#,1))
INC o#
NEXT j#
DEC foundif#
WEND
ENDIF
GOTO nextline
ENDIF
IF foundcom#=FALSE
IF CHR$(byte#)="I" OR CHR$(byte#)="i"
foundcom#=TRUE
POKE outbuffer#+o#,byte#
INC o#
INC i#
byte#=PEEK(inbuffer#+i#)
IF CHR$(byte#)="F" OR CHR$(byte#)="f"
foundif#=foundif#+1
POKE outbuffer#+o#,byte#
INC o#
INC i#
GOTO nextchar
ENDIF
ENDIF
ENDIF
' ###########################################
' looking for THEN, GOSUB or GOTO after an IF
' ###########################################
IF foundif# !AND foundcom
b$=CHR$(byte#)
IF b$="T" OR b$="t"
GOTO ckit
ENDIF
IF b$="G" OR b$="g"
GOTO ckig
ENDIF
IF b$="E" OR b$="e"
GOTO ckie
ENDIF
ENDIF
' ##############################
' copy character and go for next
' ##############################
POKE outbuffer#+o#,byte#
INC i#
INC o#
GOTO nextchar
' ################################
' ################################
' ##############
' check for THEN
' ##############
ckit:
IF CHR$(PEEK(inbuffer#+i#+1))<>"H" AND CHR$(PEEK(inbuffer#+i#+1))<>"h"
GOTO ckng
ENDIF
IF CHR$(PEEK(inbuffer#+i#+2))<>"E" AND CHR$(PEEK(inbuffer#+i#+2))<>"e"
GOTO ckng
ENDIF
IF CHR$(PEEK(inbuffer#+i#+3))<>"N" AND CHR$(PEEK(inbuffer#+i#+3))<>"n"
GOTO ckng
ENDIF
i#=i#+3
GOSUB crpoke
' ################################
' check if THEN followed by line #
' ################################
ckit1:
j#=i#+1
ckit2:
b2#=PEEK(inbuffer#+j#)
IF b2#=32
INC j#
GOTO ckit2
ENDIF
IF b2#>47 AND b2#<58
FOR j#=1 TO LEN(go$)
POKE outbuffer#+o#,ASC(MID$(go$,j#,1))
INC o#
NEXT j#
ENDIF
GOTO nextchar
' #####################
' ELSE following an IF?
' #####################
ckie:
IF CHR$(PEEK(inbuffer#+i#+1))<>"L" AND CHR$(PEEK(inbuffer#+i#+1))<>"l"
GOTO ckng
ENDIF
IF CHR$(PEEK(inbuffer#+i#+2))<>"S" AND CHR$(PEEK(inbuffer#+i#+2))<>"s"
GOTO ckng
ENDIF
IF CHR$(PEEK(inbuffer#+i#+3))<>"E" AND CHR$(PEEK(inbuffer#+i#+3))<>"e"
GOTO ckng
ENDIF
GOSUB crpoke
DEC i#
FOR j#=1 TO 4
POKE outbuffer#+o#,PEEK(inbuffer#+i#)
INC o#
INC i#
NEXT j#
GOSUB crpoke
DEC i#
GOTO ckit1
' ########################
' check for GOSUB and GOTO
' ########################
ckig:
IF CHR$(PEEK(inbuffer#+i#+1))<>"O" AND CHR$(PEEK(inbuffer#+i#+1))<>"o"
GOTO ckng
ENDIF
IF CHR$(PEEK(inbuffer#+i#+2))="S" OR CHR$(PEEK(inbuffer#+i#+2))="s"
GOTO cksub
ENDIF
IF CHR$(PEEK(inbuffer#+i#+2))<>"T" AND CHR$(PEEK(inbuffer#+i#+2))<>"t"
GOTO ckng
ENDIF
IF CHR$(PEEK(inbuffer#+i#+3))<>"O" AND CHR$(PEEK(inbuffer#+i#+3))<>"o"
GOTO ckng
ENDIF
GOSUB crpoke
POKE outbuffer#+o#,ASC(b$)
INC o#
GOTO nextchar
cksub:
IF CHR$(PEEK(inbuffer#+i#+3))<>"U" AND CHR$(PEEK(inbuffer#+i#+3))<>"u"
GOTO ckng
ENDIF
IF CHR$(PEEK(inbuffer#+i#+4))<>"B" AND CHR$(PEEK(inbuffer#+i#+4))<>"b"
GOTO ckng
ENDIF
GOSUB crpoke
POKE outbuffer#+o#,ASC(b$)
INC o#
GOTO nextchar
' ######################
' Not a match so keep on
' ######################
ckng:
POKE outbuffer#+o#,byte#
INC o#
INC i#
GOTO nextchar
' ########################
' add a line feed
' #######################
PROCEDURE crpoke
POKE outbuffer#+o#,13
INC o#
POKE outbuffer#+o#,10
INC o#
INC i#
foundcom#=FALSE
RETURN
' #########
' finish up
' ##########
finis:
CLOSE #1
POKE outbuffer#+o#,13
INC o#
POKE outbuffer#+o#,10
INC o#
BSAVE z$,outbuffer#,o#+1
PRINT
PRINT "done."
btime#=1+INT((TIMER/200)-atime#)
ctime#=INT(btime#/60)
btime#=btime#-(ctime#*60)
PRINT
PRINT "Conversion time:"
PRINT " ";
IF ctime#
PRINT ctime#;" minute";
IF ctime#>1
PRINT "s";
ENDIF
PRINT ", ";
ENDIF
PRINT btime#;" second";
IF btime#>1
PRINT "s";
ENDIF
PRINT "."
ALERT 0,"all done",1,"ok",g#
EDIT
' ####################